/*
 * 支持巴法app配网，长按按键可重新配网
 */
#include "device_control.h"

AceButton ledButton(BTN_PIN); // 按钮配置接口
Preferences preferences;      // 定义Preferences对象

// 定义引脚和PWM参数
#define PWM_CHANNEL 0      // 使用PWM通道0
#define PWM_FREQUENCY 5000 // 设置PWM频率为5kHz
#define PWM_RESOLUTION 8   // 设置PWM分辨率为8位 (0-255)

// 函数：将输入值从1-100映射到PWM占空比
uint32_t mapToPwmDutyCycle(int inputVal)
{
    return map(inputVal, 1, 100, 0, 255); // 将1-100映射到0-255
}

// 打开灯泡
void turnOnLed()
{
    Serial.println("Turn ON");
    ledcWrite(PWM_CHANNEL, mapToPwmDutyCycle(savedBrightness));
    // analogWrite(LED_PIN, savedBrightness); // 假设分辨率为 8 位，255 * 20% = 51
}
// 关闭灯泡
void turnOffLed()
{
    Serial.println("Turn OFF");
    ledcWrite(PWM_CHANNEL, 0); // 对于4位分辨率，8表示50%
    // analogWrite(LED_PIN, 0); // 假设分辨率为 8 位，255 * 20% = 51
}
// 设置亮度
void setLedBrightness(int brightness)
{

    ledcWrite(PWM_CHANNEL, brightness);
    Serial.print("Brightness: " + String(mapToPwmDutyCycle(savedBrightness)));

    preferences.begin("settings", false); // 打开命名空间 "settings"
    preferences.putUChar("brightness", static_cast<uint8_t>(brightness));
    preferences.end(); // 关闭命名空间

    savedBrightness = brightness; // 更新全局变量
}
// 初始化，相当于main函数
void setup()
{
    // 初始化串口通信，波特率为115200
    Serial.begin(115200);

    pinMode(BTN_PIN, INPUT_PULLUP);                                       // 设置按钮引脚为输入上拉模式
    attachInterrupt(digitalPinToInterrupt(BTN_PIN), checkSwitch, CHANGE); // 设置中断，当按钮引脚检测到上升沿时调用checkSwitch函数

    // 配置灯PWM
    pinMode(LED_PIN, OUTPUT);
    ledcSetup(PWM_CHANNEL, PWM_FREQUENCY, PWM_RESOLUTION); // 配置PWM通道
    ledcAttachPin(LED_PIN, PWM_CHANNEL);                   // 将PWM通道附加到指定引脚

    // 打印初始化信息
    Serial.println("Beginning...");

    // 初始化Preferences
    preferences.begin("settings", false);                                     // 打开命名空间 "settings"
    savedBrightness = preferences.getUChar("brightness", DEFAULT_BRIGHTNESS); // 从Preferences读取保存的亮度值
    ledcWrite(PWM_CHANNEL, mapToPwmDutyCycle(savedBrightness));               // 设置初始亮度
    preferences.end();                                                        // 关闭命名空间
    Serial.print("Brightness: " + String(savedBrightness));

    // 按钮配置
    ButtonConfig *buttonConfig = ButtonConfig::getSystemButtonConfig();
    buttonConfig->setFeature(ButtonConfig::kFeatureLongPress);              // 启用长按功能
    buttonConfig->setFeature(ButtonConfig::kFeatureRepeatPress);            // 启用重复按下功能
    buttonConfig->setFeature(ButtonConfig::kFeatureSuppressAfterLongPress); // 启用长按后抑制其他事件的功能
    buttonConfig->setLongPressDelay(LONG_PRESS_TIME);                       // 设置长按时间（单位：毫秒）
    buttonConfig->setEventHandler(handleEvent);                             // 设置按钮事件处理函数

    // 使用设备的MAC地址生成主题名，并去掉冒号
    TOPIC = WiFi.macAddress().substring(8); // 取mac地址做主题用
    TOPIC.replace(":", "");                 // 去掉:号
    TOPIC = TOPIC + aptype;                 // 将设备类型附加到主题名后面

    loadConfig();       // 从EEPROM加载配置
    waitKey();          // 检查是否需要airkiss配网
    initWiFi();         // 初始化Wi-Fi连接
    checkFirstConfig(); // 检查是否是第一次配置

    // 赋值UID为配置中的cuid字段
    UID = config.cuid;

    // 删除外部中断，防止误触发
    detachInterrupt(digitalPinToInterrupt(BTN_PIN));

    // 关闭指示灯
    LAMP.close();
}

// 循环
void loop()
{
    // 检查Wi-Fi连接状态并进行必要的操作
    doWiFiTick();

    // 处理TCP客户端的消息接收
    doTCPClientTick();

    // 检查按钮状态并处理按钮事件
    ledButton.check();
}